﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using AccesoBD;
using System.Data;
using System.Data.SqlClient;
using System.Collections;
using CapaLogica.CL.Bitacora;
using CapaLogica.CL.UtilidadesGenerales;
using CapaLogica.CL.Rol;



namespace CapaLogica.CL.Usuario
{
   public class UsuarioPersistente
    {
       internal UsuarioPersistente()
       {

       } 

        private static AcessoBD _accesoBD=new AcessoBD();

    public static AcessoBD AccesoBD
    {
      get { return _accesoBD; }
      set { _accesoBD = value; }
    }

    public static int registrarUsuario(Cl_Usuario objUsuario, int idUsusarioSession)
    {
            int result = -1;

           //Sentencia sql usuarios
           String sqlQueryPersona="insert into T_Persona (cedula,nombre,primer_apellido,segundo_apellido,genero,fecha_nacimiento,estado)"
                                    +"values (param1,param2,param3,param4,param5,param6,param7)";

            //Lista de parametros
            Parametros[] parametros = new Parametros[7];
            parametros[0] = new Parametros(objUsuario.Cedula, "param1");
            parametros[1] = new Parametros(objUsuario.Nombre, "param2");
            parametros[2] = new Parametros(objUsuario.PrimerApellido, "param3");
            parametros[3] = new Parametros(objUsuario.SegundoApellido, "param4");
            parametros[4] = new Parametros(objUsuario.Genero, "param5");
            parametros[5] = new Parametros(objUsuario.FechaNacimineto, "param6");
            parametros[6] = new Parametros(1, "param7");//Estado activo por defecto


           SqlConnection conexion = AccesoBD.GetConnection();
           conexion.Open();
           SqlTransaction tran=conexion.BeginTransaction(IsolationLevel.ReadCommitted);


           try{
               //Realiza la inserción en la tabla persona
               int idPersona=AccesoBD.executeSQLInsertTransation(tran,sqlQueryPersona,parametros);

               //Sentencias sql 
                String sqlQueryUsuario="insert into T_Usuario (correo,contrasenna,id_persona,id_rol,esta_activo)"
                                        +"values(param1,param2,param3,param4,param5)";

                //Lista de parametros
                Parametros[] parametros1 = new Parametros[5];
                parametros1[0] = new Parametros(objUsuario.CorreoElectronico, "param1");
                parametros1[1] = new Parametros(objUsuario.Contrasena, "param2");//Clave momentanea se de generrar
                parametros1[2] = new Parametros(idPersona, "param3");
                parametros1[3] = new Parametros(objUsuario.Rol, "param4");
                parametros1[4] = new Parametros(1, "param5");//Estado activo por defecto


               //Inserción en la tabla de usuarios
                objUsuario.Id = AccesoBD.executeSQLInsertTransation(tran, sqlQueryUsuario, parametros1);

               String sqlQueryBlog = "Insert into T_Blog (id_usuario,estado) values(param1,0)";
        
               if (objUsuario.Rol ==1){

                   //Lista parametros
                   Parametros[] parametros2 = new Parametros[1];
                   parametros2[0] = new Parametros(objUsuario.Id, "param1");

                   //Activa el blog
                   AccesoBD.executeSQLInsertTransation(tran, sqlQueryBlog, parametros2);
               }

               //Inserción en bitacora
               Modulo.insertarBitacoraParaTransaccion(tran,idUsusarioSession, "Se ingresa el usuario" + objUsuario.Nombre + " " + objUsuario.PrimerApellido + " " + objUsuario.SegundoApellido, objUsuario.Id, 2, 1);

               result = objUsuario.Id;

               //Confirma la transacción
               tran.Commit();
           }catch (Exception  ex){
                
               
               tran.Rollback();
               SqlException exsql = ex as SqlException ;
               SqlError er = exsql.Errors[0]  ;

               if (er.Number == 2601)
               {
                   throw new Exception("Existe un usuario con la misma cédula o correo, favor verifique.");
               }
               else
               {
                   throw new Exception("Ha habido un error al registrar el usuario. " );
               }
            
           } 
        
        finally{
           
               //Cierra la conexion
                conexion.Close();
           }

           return result;

       }



    public static bool registrarUsuarioBatch(List<Cl_Usuario> ListaUsuarios, List<string> listapwd, int idUsusarioSession)
    {
        bool result = true;
        SqlConnection con = _accesoBD.GetConnection();
        con.Open();
        SqlTransaction tran = con.BeginTransaction();

        try
        {


            for (int i = 0; i < ListaUsuarios.Count; i++)
            {

                Cl_Usuario objUsuario = ListaUsuarios[i];

                //Sentencia sql usuarios
                String sqlQueryPersona = "insert into T_Persona (cedula,nombre,primer_apellido,segundo_apellido,genero,fecha_nacimiento,estado)"
                                         + "values (param1,param2,param3,param4,param5,param6,param7)";

                //Lista de parametros
                Parametros[] parametros = new Parametros[7];
                parametros[0] = new Parametros(objUsuario.Cedula, "param1");
                parametros[1] = new Parametros(objUsuario.Nombre, "param2");
                parametros[2] = new Parametros(objUsuario.PrimerApellido, "param3");
                parametros[3] = new Parametros(objUsuario.SegundoApellido, "param4");
                parametros[4] = new Parametros(objUsuario.Genero, "param5");
                parametros[5] = new Parametros(objUsuario.FechaNacimineto, "param6");
                parametros[6] = new Parametros(1, "param7");//Estado activo por defecto


                //Realiza la inserción en la tabla persona
                objUsuario.Id = AccesoBD.executeSQLInsertTransation(tran, sqlQueryPersona, parametros);

                //Sentencias sql 
                String sqlQueryUsuario = "insert into T_Usuario (correo,contrasenna,id_persona,id_rol,esta_activo)"
                                        + "values(param1,param2,param3,param4,param5)";

                //Lista de parametros
                Parametros[] parametros1 = new Parametros[5];
                parametros1[0] = new Parametros(objUsuario.CorreoElectronico, "param1");
                parametros1[1] = new Parametros(objUsuario.Contrasena, "param2");//Clave momentanea se de generrar
                parametros1[2] = new Parametros(objUsuario.Id, "param3");
                parametros1[3] = new Parametros(objUsuario.Rol, "param4");
                parametros1[4] = new Parametros(1, "param5");//Estado activo por defecto


                //Inserción en la tabla de usuarios
                int idUsuario = AccesoBD.executeSQLInsertTransation(tran, sqlQueryUsuario, parametros1);

                String sqlQueryBlog = "Insert into T_Blog (id_usuario,estado) values(param1,1)";




                if (objUsuario.Rol == 1)
                {
                    //Lista parametros
                    Parametros[] parametros2 = new Parametros[1];
                    parametros2[0] = new Parametros(idUsuario, "param1");

                    //Activa el blog
                    AccesoBD.executeSQLInsertTransation(tran, sqlQueryBlog, parametros2);
                }

                //Inserción en bitacora
                Modulo.insertarBitacoraParaTransaccion(tran, idUsusarioSession, "Se ingresa el usuario" + objUsuario.Nombre + " " + objUsuario.PrimerApellido + " " + objUsuario.SegundoApellido, objUsuario.Id, 2, 1);

            }

            //Confirma la transacción
            tran.Commit();


        }
        catch (Exception ex)
        {
            result = false;

            //Reversa la transacción
            tran.Rollback();
            SqlException exsql = ex as SqlException;
            SqlError er = exsql.Errors[0];

            if (er.Number == 2601)
            {
                throw new Exception("Ya hay un usuario con el mismo correo electronico.");
            }
            else
            {
                throw new Exception("Ha habido un error al registrar el usuario. " + er.Number);
            }

        }

        finally
        {

            //Cierra la conexion
            con.Close();
        }



        try
        {
            //Envio de correos
            for (int j = 0; j < ListaUsuarios.Count; j++)
            {
                Modulo.enviarCorreo(listapwd[j], ListaUsuarios[j].CorreoElectronico);
            }
        }
        catch (Exception ex) {
            throw new Exception("Ocurrio un error a la hora de enviar los correos");
        }

        return result;

    }

        
        /// <summary>
        /// Método de la clase encargado listar los estudiantes de un grupo.
        /// </summary>
        /// <param name="pIdGrupo">Id del grupo, tipo int</param>
        /// <remarks></remarks>
        public List<Cl_Estudiante> listarEstudiantesGrupo(int pIdGrupo)
        {
            List<Cl_Estudiante> usuarios = new List<Cl_Estudiante>();
            Cl_Estudiante usuario = null;

            string psp = @"dbo.sp_buscar_estudiantes_de_grupo";

            Parametros[] parametros = new Parametros[1];
            parametros[0] = new Parametros(pIdGrupo, "idGrupo");

            try
            {
                SqlDataReader reader = _accesoBD.execute_SP_Consulta(psp, parametros);

                while (reader.Read())
                {
                    usuario = new Cl_Estudiante(reader.GetString(1), reader.GetString(2),
                                         reader.GetString(3), reader.GetString(4),
                                         reader.GetString(5), reader.GetDateTime(6),
                                         (int)reader.GetInt32(9),
                                         reader.GetString(7), reader.GetString(8));
                    
                    usuario.Id = reader.GetInt32(0);

                    usuarios.Add(usuario);
                }
                reader.Close();
                return usuarios;
            }
            catch (Exception ex)
            {
                throw new System.Exception(ex.Message);
            }


        }



    public static void  setCarrerasUsuario(int pidUsuario, int prol, List<int> plistaCarreras,List<int> plistaBD,SqlTransaction tran)
    {


            try
            {

                //Rol 3 Director
                bool indRol = prol == 3;
                String entidad = indRol ? "id_director" : "id_estudiante";
                String tabla = indRol ? "T_Director_Carrera" : "T_Estudiante_Carrera";
                String sqlCarreras = "insert into " + tabla + "(" + entidad + ",id_carrera)"
                                       + "values(param1,param2)";

                String sqlUpdate = " delete " + tabla +
                                " where " + entidad + "=param1 and id_carrera=param2";


                //Lista parametros
                Parametros[] parametros = new Parametros[2];
                parametros[0] = new Parametros(pidUsuario, "param1");
                parametros[1] = new Parametros("", "param2");


                //Estructura bitacora
                EsBitacora esBita = new EsBitacora();
                esBita.Descripcion = "Se asocia la lista de carreras al usuario";
                esBita.IdUsuario = Session.Id;
                esBita.Tipo = Convert.ToString (2);

                if (plistaCarreras.Count > 0)
                {
                    Modulo.comparaListas(plistaCarreras, (plistaBD != null ? plistaBD : null), (plistaBD != null ? sqlUpdate : null), sqlCarreras, (plistaBD != null ? parametros : null), parametros, esBita, tran);
                }

            }
            catch(Exception ex) {
                Modulo.LogError(pidUsuario, "Insertar relación carrera usuario", ex.Message);
                                
                SqlException exsql = ex as SqlException;
                SqlError er = exsql.Errors[0];

                if (er.Number == 2601 && prol ==3)
                {
                    throw new Exception("Ya hay un director academico para una de las carreras seleccionadas.");
                }
                else
                {
                  throw new Exception("Ocurrio un error al insertar la relación de carreras");
                }
            }

            
        }

        /// <summary>
        /// Método de la clase que busca un usuario por cedula y rol de usuario.
        /// </summary>
        /// <param name="pCedula">Cedula de la persona, tipo string</param>
        /// <param name="pRol">Rol del usuario, tipo int</param>
        /// <remarks></remarks>
        public Cl_Usuario buscarPorCedula(string pCedula, int pRol)
        {
            string psp = @"dbo.sp_buscar_usuario_por_cedula";
            Cl_Usuario usuario = null;
            Parametros[] parametros = new Parametros[2];
            parametros[0] = new Parametros(pCedula, "cedula");
            parametros[1] = new Parametros(pRol, "rol");

            try
            {
                SqlDataReader reader = _accesoBD.execute_SP_Consulta(psp, parametros);

                if (reader.Read())
                {
                    usuario = new Cl_Usuario(reader.GetString(1), reader.GetString(2),
                                         reader.GetString(3), reader.GetString(4),
                                         reader.GetString(5), reader.GetDateTime(6),
                                         (int)reader.GetInt32(9),
                                         reader.GetString(7), reader.GetString(8));

                    usuario.Id = reader.GetInt32(0);
                }

                reader.Close();
                return usuario;

            }
            catch (Exception ex)
            {
                throw new System.Exception(ex.Message);
            }
        }




        /// <summary>
        /// Método de la clase que busca los docentes de la BD
        /// </summary>
        /// <remarks></remarks>
        public static List<Cl_Docente> buscarDocentes()
        {
            string psp = @"dbo.sp_buscar_todos_los_profesores";
            Cl_Docente docente = null;
            List<Cl_Docente> docentes = new List<Cl_Docente>();

            try
            {
                SqlDataReader reader = _accesoBD.execute_SP_Consulta(psp, null);

                while (reader.Read())
                {
                    docente = new Cl_Docente(reader.GetString(1), reader.GetString(2),
                                         reader.GetString(3), reader.GetString(4),
                                         reader.GetString(5), reader.GetDateTime(6),
                                         (int)reader.GetInt32(9),
                                         reader.GetString(7), reader.GetString(8));

                    docente.Id = reader.GetInt32(0);

                    docentes.Add(docente);
                }

                reader.Close();
                return docentes;

            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        /// <summary>
        /// Método de la clase que busca un usuario por el id de usuario.
        /// </summary>
        /// <param name="pId">Id de la persona, tipo int</param>
        /// <remarks></remarks>
        public Cl_Usuario buscarPorId(int pId)
        {
            string psp = @"dbo.sp_buscar_usuario_por_id";
            Cl_Usuario usuario = null;
            Parametros[] parametros = new Parametros[1];
            parametros[0] = new Parametros(pId, "id");

            try
            {
                SqlDataReader reader = _accesoBD.execute_SP_Consulta(psp, parametros);

                if (reader.Read())
                {
                    usuario = new Cl_Usuario(reader.GetString(1), reader.GetString(2),
                                         reader.GetString(3), reader.GetString(4),
                                         reader.GetString(5), reader.GetDateTime(6),
                                         reader.GetInt32(9),
                                         reader.GetString(7), reader.GetString(8));
                    
                    usuario.Id = reader.GetInt32(0);
                }

                reader.Close();
                return usuario;

            }
            catch (Exception ex)
            {
                throw new System.Exception(ex.Message);
            }
        }

        /// <summary>
        /// Método de la clase que busca los docentes de un grupo.
        /// </summary>
        /// <param name="pIdGrupo">In del grupo, tipo int</param>
        /// <remarks></remarks>
        public List<Cl_Docente> buscarDocentesDeUnGrupo(int pIdGrupo)
        {
            string psp = @"dbo.sp_buscar_docentes_de_grupo";
            Cl_Docente docente = null;
            Parametros[] parametros = new Parametros[1];
            parametros[0] = new Parametros(pIdGrupo, "idGrupo");
            List<Cl_Docente> docentes = new List<Cl_Docente>();
            try
            {
                SqlDataReader reader = _accesoBD.execute_SP_Consulta(psp, parametros);

                while (reader.Read())
                {
                    docente = new Cl_Docente(reader.GetString(1), reader.GetString(2),
                                         reader.GetString(3), reader.GetString(4),
                                         reader.GetString(5), reader.GetDateTime(6),
                                         reader.GetInt32(9),
                                         reader.GetString(7), reader.GetString(8));

                                        

                    docente.Id = reader.GetInt32(0);
                    docentes.Add(docente);
                }

                reader.Close();
                return docentes;

            }
            catch (Exception ex)
            {
                throw new System.Exception(ex.Message);
            }
        }


        /// <summary>
        /// Método de la clase que busca los estudiantes de un grupo.
        /// </summary>
        /// <param name="pIdGrupo">In del grupo, tipo int</param>
        /// <remarks></remarks>
        public List<Cl_Estudiante> buscarEstudiantesDeUnGrupo(int pIdGrupo)
        {
            string psp = @"dbo.sp_buscar_estudiantes_de_grupo";
            Cl_Estudiante estudiante = null;
            Parametros[] parametros = new Parametros[1];
            parametros[0] = new Parametros(pIdGrupo, "idGrupo");
            List<Cl_Estudiante> estudiantes = new List<Cl_Estudiante>();
            try
            {
                SqlDataReader reader = _accesoBD.execute_SP_Consulta(psp, parametros);

                while (reader.Read())
                {
                    estudiante = new Cl_Estudiante(reader.GetString(1), reader.GetString(2),
                                         reader.GetString(3), reader.GetString(4),
                                         reader.GetString(5), reader.GetDateTime(6),
                                         reader.GetInt32(9),
                                         reader.GetString(7), reader.GetString(8));

                    estudiante.Id = reader.GetInt32(0);
                    estudiantes.Add(estudiante);
                }

                reader.Close();
                return estudiantes;

            }
            catch (Exception ex)
            {
                throw new System.Exception(ex.Message);
            }
        }



        /// <summary>
        /// Método de la clase que busca los ids de los profesores asociados a un grupo.
        /// </summary>
        /// <param name="pIdGrupo">In del grupo, tipo int</param>
        /// <remarks></remarks>
        public List<int> buscarIdsProfesoresDeGrupo(int pIdGrupo)
        {

            string psp = @"dbo.sp_buscar_ids_docentes_de_grupo";
            Parametros[] parametros = new Parametros[1];
            parametros[0] = new Parametros(pIdGrupo, "idGrupo");
            
            try
            {
                SqlDataReader reader = _accesoBD.execute_SP_Consulta(psp, parametros);
                List<int> ids = new List<int>();
                while (reader.Read())
                {
                    ids.Add((int)reader["id_usuario"]);
                }

                reader.Close();
                return ids;

            }
            catch (Exception ex)
            {
                throw ex;
            }

        }







        public static void eliminarUsuario(int idSessionUsuario, Cl_Usuario pobjUsuario)//parametros del grupo
        {

            Parametros[] parametros = new Parametros[1];
            String sql = @"DELETE from dbo.T_Usuario where id_usuario=param1";


            parametros[0] = new Parametros(pobjUsuario.Id, "param1");

            try
            {
                 AccesoBD.executeSQL(sql, parametros);

               
                    Modulo.insertarBitacora(pobjUsuario.Id, "Eliminacion de usuario: " + pobjUsuario.Nombre + " " + pobjUsuario.PrimerApellido+" "+pobjUsuario.SegundoApellido, idSessionUsuario, 2, 2);       
            }
            catch (Exception ex)
            {
                Modulo.LogError(idSessionUsuario, "Eliminación del usuario " + pobjUsuario.Cedula, ex.Message);
                throw ex;
            }

        }




        public void graduarEstudiante(int pidEstudiante, String pcedulaEstudiante, int pIdUsuario)//parametros del grupo
        {

            Parametros[] parametros = new Parametros[1];
            String sqlUpdate = @"Update dbo.T_Usuario SET esta_activo = 0 where dbo.T_Usuario.id_persona = param1";
            String sqlInsert = @"insert into dbo.T_Estudiante_Graduado(id_usuario) values(param1)";

            parametros[0] = new Parametros(pidEstudiante, "param1");

            try
            {
                int idUpdate;
                int idInsert;

                idUpdate = _accesoBD.executeSQLInsert(sqlUpdate, parametros);
                idInsert = _accesoBD.executeSQLInsert(sqlInsert, parametros);

                if (idUpdate != -1 | idInsert != -1)
                {
                    Modulo.insertarBitacora(pIdUsuario, "Graduación de estudiante", pidEstudiante, 2, 1);

                }
            }
            catch (Exception)
            {
                throw new Exception("Error al graduar el estudiante.");
            }

        }

        
        /// <summary>
        /// Método de la clase que busca usuarios por diferentes criterios
        /// </summary>
        /// <remarks></remarks>
        public static List<Cl_Usuario> buscarUsuarios(String pcedula, string pnombre, string pap1, string pap2, string pcorreo, int prol, int pid_usuario)
        {
            int countParam = 0;
            countParam += pcedula.Length > 0 ? 1 : 0;
            countParam += pnombre.Length > 0 ? 1 : 0;
            countParam += pap1.Length > 0 ? 1 : 0;
            countParam += pap2.Length > 0 ? 1 : 0;
            countParam += pcorreo.Length > 0 ? 1 : 0;
            countParam += prol > -1 ? 1 : 0;
            countParam += pid_usuario > -1 ? 1 : 0;

            string[] listaParams = { "cedula", "nombre", "ap2", "ap2", "correo", "id_rol", "id_usuario" };
   

            List<Cl_Usuario> usuarios = new List<Cl_Usuario>();
            Cl_Usuario usuario = null;

            string psp = @"dbo.sp_buscar_usuarios";

            int index = 0;
            Parametros[] parametros = new Parametros[countParam];

            if (pcedula.Length > 0) {
                parametros[index] = new Parametros(pcedula, listaParams[0]);
                index++;
            }

            if (pnombre.Length > 0) {
                parametros[index] = new Parametros(pnombre, listaParams[1]);
                index++;
            }

            if (pap1.Length > 0)
            {
                parametros[index] = new Parametros(pap1, listaParams[2]);
                index++;
            }

            if (pap2.Length > 0)
            {
                parametros[index] = new Parametros(pap2, listaParams[3]);
                index++;
            }

            if (pcorreo.Length > 0)
            {
                parametros[index] = new Parametros(pcorreo, listaParams[4]);
                index++;
            }

            if (prol > -1)
            {
                parametros[index] = new Parametros(prol, listaParams[5]);
                index++;
            }

            if(pid_usuario>-1){
                parametros[index] = new Parametros(pid_usuario, listaParams[6]);
                index++;
            }


            try
            {
                SqlDataReader reader = _accesoBD.execute_SP_Consulta(psp, parametros);

                while (reader.Read())
                {
                    usuario = new Cl_Usuario(reader.GetString(reader.GetOrdinal("cedula")), 
                                         reader.GetString(reader.GetOrdinal("nombre")),
                                         reader.GetString(reader.GetOrdinal("primer_apellido")), 
                                         reader.GetString(reader.GetOrdinal("segundo_apellido")),
                                         reader.GetString(reader.GetOrdinal("genero")), 
                                         reader.GetDateTime(reader.GetOrdinal("fecha_nacimiento")),
                                         (int)reader.GetInt32(reader.GetOrdinal("id_rol")),
                                         reader.GetString(reader.GetOrdinal("correo")), 
                                         reader.GetString(reader.GetOrdinal("contrasenna")));


                    usuario.Id = reader.GetInt32(reader.GetOrdinal("id_usuario"));
                    usuario.IdPersona = reader.GetInt32(reader.GetOrdinal("id_persona"));
                    usuario.NombreRol = reader.GetString(reader.GetOrdinal("nom_rol"));

                    usuarios.Add(usuario);
                }
                reader.Close();
                return usuarios;
            }
            catch (Exception ex)
            {
                throw new System.Exception(ex.Message);
            }


        }

        public static void actualizarUsuario(Cl_Usuario objUsuario, int idUsusarioSession)
        {

            //Actualiza la tabla usuario
            string sqlQueryUsuario = "Update T_Usuario" +
                       " set correo=param1,id_rol=param2"+
                       " where id_usuario=param3";
            Parametros[] listaParmasUsuarios = new Parametros[3];
            listaParmasUsuarios[0] = new Parametros(objUsuario.CorreoElectronico, "param1");
            listaParmasUsuarios[1] = new Parametros(objUsuario.Rol, "param2");
            listaParmasUsuarios[2] = new Parametros(objUsuario.Id, "param3");


            //Actualiza la tabla Persona
            string sqlQueryPer = "Update T_Persona" +
                                   " set cedula=param1,nombre=param2,primer_apellido=param3," +
                                   " segundo_apellido=param4,genero=param5,fecha_nacimiento=param6,estado=param7" +
                                   " where id_persona=param8";
            Parametros[] listaParmasPer=new Parametros[8];
            listaParmasPer[0] = new Parametros(objUsuario.Cedula, "param1");
            listaParmasPer[1] = new Parametros(objUsuario.Nombre, "param2");
            listaParmasPer[2] = new Parametros(objUsuario.PrimerApellido, "param3");
            listaParmasPer[3] = new Parametros(objUsuario.SegundoApellido, "param4");
            listaParmasPer[4] = new Parametros(objUsuario.Genero, "param5");
            listaParmasPer[5] = new Parametros(objUsuario.FechaNacimineto, "param6");
            listaParmasPer[6] = new Parametros(objUsuario.Estado, "param7");
            listaParmasPer[7] = new Parametros(objUsuario.IdPersona, "param8");

            //Se incia la transacción
            SqlConnection conex = AccesoBD.GetConnection();
            conex.Open();
            SqlTransaction tran = conex.BeginTransaction();

            try
            {

                //Actualiza en la tabla persona
                AccesoBD.executeSQLTransation(tran, sqlQueryPer, listaParmasPer);

                //Actualiza en la tabla de usuario
                AccesoBD.executeSQLTransation(tran, sqlQueryUsuario, listaParmasUsuarios);

                //inserta en la bitacora
                Modulo.insertarBitacora(idUsusarioSession, "Se actualiza el usuario cedula " + objUsuario.Cedula,objUsuario.Id, 2, 3);

                //Confirma
                tran.Commit();

            }
            catch (Exception ex)
            {
                
               tran.Rollback();
               SqlException exsql = ex as SqlException ;
               SqlError er = exsql.Errors[0]  ;

               if (er.Number == 2601)
               {
                   throw new Exception("Ya hay un usuario con la misma cédula o correo electronico.");
               }
               else
               {
                   throw new Exception("Ha habido un error al registrar el usuario. " );
               }
            
           
            }
            finally {
                conex.Close();
            }
        }


        /// <summary>
        /// Método de la clase que trae todos los roles desde la base de datos
        /// </summary>
        /// <remarks></remarks>
        public static List<EsRol> listarRoles()
        {

            List<EsRol> listaRoles = new List<EsRol>();

            string psp = @"dbo.sp_listar_roles";
            Parametros[] parametros = null;

            try
            {
                SqlDataReader reader = _accesoBD.execute_SP_Consulta(psp, parametros);

                while (reader.Read())
                {
                    EsRol objRol = new EsRol();
                    objRol.Id= reader.GetInt32(reader.GetOrdinal("id_rol"));
                    objRol.Nombre=reader.GetString(reader.GetOrdinal("nombre"));
                    listaRoles.Add(objRol);
                }
                reader.Close();
                return listaRoles;
            }
            catch (Exception ex)
            {
                throw new System.Exception(ex.Message);
            }


        }

        public List<EsUsuario> buscarDirectoresAcademicos()
        {
            AcessoBD _acceso = new AcessoBD();
            string psp = @"dbo.sp_buscar_todos_los_directores";
            List<EsUsuario> directores = new List<EsUsuario>();

            try
            {
                SqlDataReader reader = _acceso.execute_SP_Consulta(psp, null);

                while (reader.Read())
                {
                    EsUsuario temp = new EsUsuario(reader.GetInt32(0),
                                                     reader.GetString(1),
                                                    reader.GetString(2));
                    directores.Add(temp);
                }

                reader.Close();
                return directores;

            }
            catch (Exception ex)
            {
                throw ex;
            }

        }

        public static void eliminarRelacionCarrera(Cl_Usuario objUsuario)
        {
            String sqlQueryEst = "delete T_Estudiante_Carrera where id_estudiante=param1";
            String sqlQueryDir = "delete T_Director_Carrera where id_director=param1";

            Parametros[] listaParmas = new Parametros[1];
            listaParmas[0] = new Parametros(objUsuario.Id, "param1");

            if (objUsuario.Rol == 1)
            {
                AccesoBD.executeSQL(sqlQueryEst, listaParmas);
            }
            else
            {
                AccesoBD.executeSQL(sqlQueryDir, listaParmas);
            }
            

        }


        public static bool buscarEstudianteGraduado(String cedula)
        {
            bool existe;
            string psp = @"dbo.sp_buscar_estudiante_graduado";

            Parametros[] parametros = new Parametros[1];
            parametros[0] = new Parametros(cedula, "cedula");
            ArrayList id = new ArrayList();

            try
            {
                SqlDataReader reader = AccesoBD.execute_SP_Consulta(psp, parametros);
              
                while (reader.Read())
                {
                    id.Add(reader.GetInt32(0));
                }
                reader.Close();

            }
            catch (Exception ex)
            {
                throw new System.Exception(ex.Message);
            }


            if (id.Count == 0){
                existe= false;
            }else{
                existe= true;
            }

            return existe;

        }



        public List<EsUsuario> buscarUsuariosConBlog()
        {
            AcessoBD _acceso = new AcessoBD();
            string psp = @"dbo.sp_buscar_usuarios_con_blog";
            List<EsUsuario> usuarios = new List<EsUsuario>();
            EsUsuario usuario;

            try
            {
                SqlDataReader reader = _acceso.execute_SP_Consulta(psp, null);

                while (reader.Read())
                {
                    usuario= new EsUsuario();
                    usuario.Id = reader.GetInt32(0);
                    usuario.Cedula = reader.GetValue(1).ToString();
                    usuario.Nombre = reader.GetValue(2).ToString();

                    usuarios.Add(usuario);
                }

                reader.Close();
                return usuarios;

            }
            catch (Exception ex)
            {
                throw ex;
            }

        }

    }
}
